
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Eureka原理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Eureka原理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">组件</div>
          <div class="card-question">Eureka生态系统由哪三个核心组件构成，它们各自的职责是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">组件</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Eureka生态系统由三个核心组件构成：1. Eureka Server：服务注册中心，负责保存服务实例信息并提供服务注册与发现功能。2. Eureka Client：客户端组件，服务实例通过它将自身注册到Server，并从Server获取其他服务信息。3. Eureka Dashboard：提供可视化的管理界面，用于监控服务状态和注册信息。</div>
          </div>
          <div class="card-source">来源: 1.3 Eureka 组件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Eureka如何通过心跳检测机制来维护服务实例的存活状态？默认的续约和剔除时间分别是多少？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">每个注册到Eureka Server的服务实例需要通过Eureka Client定期（默认30秒）发送心跳请求（续约），以告知Server自身的存活状态。如果Eureka Server在一段时间内（默认90秒）没有收到某个实例的心跳，就会将其标记为失效并从注册表中剔除。</div>
          </div>
          <div class="card-source">来源: 2.3 Eureka 的心跳检测</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">什么是Eureka的自我保护机制？它在什么情况下会被触发，触发后会产生什么效果？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">自我保护机制是Eureka为应对网络不稳定而设计的一项特性。当Eureka Server在一段时间内收到的心跳请求数低于预设阈值（如85%）时，它会进入自我保护模式。在此模式下，Server会保护注册表中的服务实例，不会剔除任何实例，即使它们没有发送心跳，以此防止因网络问题导致的大规模服务误剔除。</div>
          </div>
          <div class="card-source">来源: 2.4 Eureka 的自我保护机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">根据CAP原则，Eureka优先保证了哪两个特性？这在实践中意味着什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Eureka在设计上遵循CAP原则中的AP模型，即优先保证可用性（Availability）和分区容错性（Partition Tolerance）。这意味着在分布式环境中，Eureka更倾向于即使在网络分区或故障的情况下也尽量保持服务可用，但这可能会牺牲一定的数据一致性。</div>
          </div>
          <div class="card-source">来源: 3.2 CAP 原则</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Eureka采用的去中心化架构主要带来了哪些优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">去中心化架构避免了单点故障问题，其优势包括：1. 高可用性：单个Eureka Server实例宕机不影响整体服务。2. 扩展性：可以根据需要动态增减Eureka Server实例。3. 容错性：服务实例可以注册到多个Server，提高了故障容忍能力。</div>
          </div>
          <div class="card-source">来源: 3.1 去中心化架构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Eureka Client中的缓存机制是如何提升系统稳定性和容错能力的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Eureka Client会在本地维护一份服务注册表的副本作为缓存。这么做可以减少对Eureka Server的请求频率。更重要的是，在网络故障或Eureka Server不可用时，客户端依然可以使用本地缓存的服务信息来进行服务发现，从而提升了服务调用的稳定性和容错能力。</div>
          </div>
          <div class="card-source">来源: 3.4 缓存机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">流程</div>
          <div class="card-question">简述一个服务实例在Eureka中完成服务注册的完整流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">流程</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">服务注册流程包括：1. 实例启动并初始化Eureka Client。2. Client向Eureka Server发送HTTP POST注册请求。3. Server保存实例信息并返回成功响应。4. 实例通过Client定期（默认30秒）发送心跳进行续约。5. 如果实例长时间（默认90秒）未续约，Server会将其从注册表中剔除。</div>
          </div>
          <div class="card-source">来源: 2.1 服务注册过程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">流程</div>
          <div class="card-question">服务消费者是如何通过Eureka发现并调用其他服务的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">流程</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">服务发现过程如下：1. 服务消费者启动并初始化Eureka Client。2. Client从Eureka Server获取全量的服务注册表信息。3. Client定期（默认30秒）获取增量更新以保持信息最新。4. 根据获取的服务实例列表，通过负载均衡策略（如轮询、随机等）选择一个目标实例。5. 服务消费者将请求发送到选定的目标服务实例。</div>
          </div>
          <div class="card-source">来源: 2.2 服务发现过程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">虽然Eureka具有高可用性，但它的设计也带来了一些不足。请指出其中一个关于数据一致性的主要缺点。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">由于Eureka采用AP模型（保证可用性和分区容错性），它的一个主要缺点是可能出现数据不一致的问题。特别是在网络分区发生时，不同Eureka Server实例之间的服务注册信息同步可能存在延迟，导致数据不一致。</div>
          </div>
          <div class="card-source">来源: 5.2 不足</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
